package inventario.code;

/**
 * Projeto Laboratorio de Programacao II
 * 
 * Classe Alocacao
 * 
 * Cria um objeto do tipo alocacao; que possui um usuario, uma maquina e uma sala 
 * 
 * @authors : Pedro Augusto, Rafael Ribeiro, Talita Lobo Projeto Laboratorio de
 *          Programacao II
 *          
 */

public class Alocacao {

	private Maquina maquina;
	private Usuario usuario;
	private Sala sala;

	/**
	 * 
	 * 
	 * @param maquina
	 *            Maquina na qual o funcionario trabalha
	 * @param Usuario
	 *            Usuario do sistema
	 * @param sala
	 *            Sala na qual trabalha a pessoa e se encontra a maquina
	 * @throws Exception
	 */
	public Alocacao(Maquina maquina, Usuario usuario, Sala sala)
			throws Exception {
		if (maquina == null || sala == null || usuario == null) {
			throw new Exception("Atributos Invalidos.");
		}
		this.maquina = maquina;
		this.usuario = usuario;
		this.sala = sala;
	}

	/**
	 * 
	 * @return Maquina na qual o usuario trabalha
	 */
	public Maquina getMaquina() {
		return maquina;
	}

	/**
	 * 
	 * @return Retorna usuario da maquina alocada
	 */
	public Usuario getUsuario() {
		return usuario;
	}

	/**
	 * 
	 * @return Retorna a sala na qual o usuario e maquina estao alocados
	 */
	public Sala getSala() {
		return sala;
	}

	/**
	 * Metodo que muda a maquina alocada para SALA E USUARIO
	 * 
	 * @param novaMaquina
	 *            Nova maquina alocada
	 */
	public void setMaquina(Maquina novaMaquina) {
		this.maquina = novaMaquina;
	}

	/**
	 * Metodo que muda o usuario para a maquina e sala alocadas
	 * 
	 * @param novoUsuario
	 *            objeto referente ao novo usuario
	 */
	public void setUsuario(Usuario novoUsuario) {
		this.usuario = novoUsuario;
	}

	/**
	 * Metodo que muda a sala para usuario e maquina alocados
	 * 
	 * @param novaSala
	 *            muda o objeto que aloca maquina e usuario
	 */
	public void setSala(Sala novaSala) {
		this.sala = novaSala;
	}

	/**
     * Informacoes sobre a Alocacao: Sala, Pessoa e Maquina
     */
	@Override
	public String toString() {
		String print = ".: Sala: " + sala.getNome() + "\n.: Usuario: "
				+ usuario.getNome() + "\n.: Maquina: " + maquina.getNome();
		return print;
	}

	/**
     * Metodo que compara dois objetos do tipo alocacao e responde com um booleano
     * se eles sao iguais.
     *
     * @param sala
     *            Adiciona um objeto do tipo Sala para comparar com outro objeto
     *            do tipo Sala.
     *
     * @return Retorna um booleano indicando se os objetos sao iguais.
     */
	@Override
	public boolean equals(Object objeto) {

		if (!(objeto instanceof Alocacao)) {
			return false;
		}

		Alocacao alocacao = (Alocacao) objeto;

		return getUsuario().equals(alocacao.getUsuario())
				&& getMaquina().equals(alocacao.getMaquina())
				&& getSala().equals(alocacao.getSala());
	}

}
